package com.tanglongan.designPattern.dp18_observer.demo99;

import java.util.ArrayList;
import java.util.List;

public class GenericClient {
    /**
     * 抽象观察者：定义了响应通知的更新方法
     */
    public interface IObserver<E> {
        void update(E event);
    }

    /**
     * 具体观察者：当得到状态更新的通知时，会自动做出响应
     */
    public static class ConcreteObserver<E> implements IObserver<E> {
        @Override
        public void update(E event) {
            System.out.println("receive event: " + event);
        }
    }

    /**
     * 抽象主题：被观察的对象。该角色是一个抽象类或接口，定义了增加、删除、通知观察者对象的方法
     */
    public interface ISubject<E> {
        boolean attach(IObserver<E> observer);

        boolean detach(IObserver<E> observer);

        void notify(E event);
    }

    /**
     * 具体主题: 具体被观察者，当其内部状态变化时，会通知已注册的观察者
     */
    static class ConcreteSubject<E> implements ISubject<E> {
        private List<IObserver<E>> observers = new ArrayList<>();

        @Override
        public boolean attach(IObserver observer) {
            return !this.observers.contains(observer) && this.observers.add(observer);
        }

        @Override
        public boolean detach(IObserver observer) {
            return this.observers.remove(observer);
        }

        @Override
        public void notify(E event) {
            for (IObserver<E> observer : this.observers) {
                observer.update(event);
            }
        }
    }

    public static void main(String[] args) {
        //被观察者
        ISubject<String> observable = new ConcreteSubject<>();
        //观察者
        IObserver<String> observer = new ConcreteObserver<>();
        observable.attach(observer);
        observable.notify("hello world");
    }
}
